{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Question检索 -- 丰富短句信息\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import re\n",
    "from tqdm import tqdm\n",
    "import traceback\n",
    "import random\n",
    "import sys\n",
    "import pprint\n",
    "import jieba\n",
    "\n",
    "sys.path.insert(0, \"/home/team55/notespace/zengbin\")\n",
    "\n",
    "from jddc.config import PreConfig\n",
    "from jddc.utils import write_file, read_file, save_to_pkl, read_from_pkl, create_logger\n",
    "from jddc.obj import Session, Sentence\n",
    "from jddc.seg import JiebaSeg\n",
    "from jddc.similarities import SentenceSimilarity\n",
    "\n",
    "conf = PreConfig()\n",
    "logger = create_logger(name='pre', log_file=conf.log_file, cmd=conf.cmd_log)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_sessions():\n",
    "    pkl_sessions = conf.pkl_sessions\n",
    "    print(\"load sessions from %s\" % pkl_sessions)\n",
    "    sess_objs = read_from_pkl(pkl_sessions)\n",
    "    return sess_objs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load sessions from /submitwork/data/temp/all_sessions.pkl\n"
     ]
    }
   ],
   "source": [
    "sessions = load_sessions()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取全部questions\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "get questions: 100%|██████████████████████████████████| 1025140/1025140 [00:05<00:00, 178500.90it/s]\n"
     ]
    }
   ],
   "source": [
    "questions = []\n",
    "for sess in tqdm(sessions, ncols=100, desc=\"get questions\"):\n",
    "    qs = \" \".join([x[1].replace(\"\\t\", \" \") for x in sess.qas_merged if x[0]==\"0\"])\n",
    "    if 50 < len(qs) < 200:\n",
    "        questions.append(qs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "730713"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(questions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建检索模型\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "ss_model = os.path.join(conf.temp_path, \"q_retrieve_100000.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "q_retrieve = read_from_pkl(ss_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "seg = JiebaSeg(conf.file_stopwords)\n",
    "q_retrieve = SentenceSimilarity(seg)\n",
    "q_retrieve.set_sentences(questions[:100000])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "q_retrieve.tfidf_model()\n",
    "q_retrieve.clear()\n",
    "save_to_pkl(file=ss_model, data=q_retrieve)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 测试检索模型\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "i = random.choice(range(100000, len(questions)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第1轮\n",
      "----------------------------------------------------------------------------------------\n",
      "亲\n",
      "[(91643,\n",
      "  0.87640554,\n",
      "  '您好亲 亲 我们后台客户申请退货，但是顾客又不想退了，我们这边为什么取消不了呢 刚刚客服说终止取件  我们具体怎么操作呢 亲 可以的 亲 '\n",
      "  '单号的话是顾客收货的单号吗 亲 订单号可以吗 [数字x] 亲 这是订单号 亲 好的 那这样我们告知客户了  这个单子就可以的吗 好的 好的亲 后台呢亲 '\n",
      "  '一直挂着怎么办呢 好的亲 好的亲 谢谢哦 没有了哦 好的亲'),\n",
      " (67922,\n",
      "  0.8344149,\n",
      "  '在的亲 在的亲 [数字x] 亲这个信息的电话能帮忙改下? [数字x] 亲帮忙改下 这样配送的时候 快递就直接联系新的了吧 没了亲'),\n",
      " (94907,\n",
      "  0.80604154,\n",
      "  '亲，在? 亲，在? 亲，在? 亲，如果我们京东的客服要求开发票，我们可以额外增加税点? 亲，是的 亲，意思是页面选择了可以开票就不能收取 '\n",
      "  '那要是显示不可以呢? 亲，好的'),\n",
      " (93352,\n",
      "  0.7826351,\n",
      "  '开通京东物流 我是商家 亲 开通京东配送  亲 怎么联系 亲 不知道的呢  亲 您不知道吗  亲亲 哦 好的  谢谢 没有 亲'),\n",
      " (5430,\n",
      "  0.7571201,\n",
      "  '亲 [订单编号:[ORDERID_10394268]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 亲 亲 麻烦同意下我的退货申请 是的 '\n",
      "  '好 好的 好的 谢谢')]\n",
      "########################################################################################\n",
      "第2轮\n",
      "----------------------------------------------------------------------------------------\n",
      "亲 电视机我们这边收到了\n",
      "[(66130,\n",
      "  0.80662376,\n",
      "  '我想看一下我的电视机什么时候发货什么时候到 我想看一下我的电视机什么时候发货什么时候 在吗? 我想看一下我的电视机什么时候发货什么时候 '\n",
      "  '[ORDERID_10455526] 谢谢'),\n",
      " (3051, 0.74319434, '这电视机不是自营的吗? 这电视机不是你们自营的吗 是的 那为什么不是京东的物流? 好吧，那没事了 没有了，谢谢'),\n",
      " (48575,\n",
      "  0.70785743,\n",
      "  '咨询订单号:[ORDERID_10192491] 订单金额:[金额x] 下单时间:[日期x] '\n",
      "  '我电视机收到了，然后你们这个订单怎么显示还在派件当中，我还有两个就是电视机挂架那些正品一起买的 现在不确认 那两件东西不发货啊 '\n",
      "  '电视机挂架还等着挂电视机了 货收到了 东西你们那边买的 收货还要我联系他们啊 你们不会联系吗 让赶紧点 电视机挂架没法发货 好 没有了'),\n",
      " (7353,\n",
      "  0.702676,\n",
      "  '咨询订单号:[ORDERID_10498669]    商品ID:1429810 订单业务咨询 电视机 安装 前几天买的电视机，需要安装 👌 么了'),\n",
      " (69495,\n",
      "  0.7019945,\n",
      "  '咨询订单号:[ORDERID_10035371] 订单金额:[金额x] 下单时间:[日期x] 亲 电视机预约安装打哪个电话? 对 好吧')]\n",
      "########################################################################################\n",
      "第3轮\n",
      "----------------------------------------------------------------------------------------\n",
      "亲 电视机我们这边收到了 你帮我查一下[数字x]个订单的发票什么时候可以开给我了\n",
      "[(20906,\n",
      "  0.583538,\n",
      "  '在吗? [订单编号:[ORDERID_10286083]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 在吗? 这个发票什么时候开给我呢? '\n",
      "  '这个发票什么时候开给我呢? 通过了 麻烦了'),\n",
      " (66130,\n",
      "  0.5533361,\n",
      "  '我想看一下我的电视机什么时候发货什么时候到 我想看一下我的电视机什么时候发货什么时候 在吗? 我想看一下我的电视机什么时候发货什么时候 '\n",
      "  '[ORDERID_10455526] 谢谢'),\n",
      " (3051, 0.5098241, '这电视机不是自营的吗? 这电视机不是你们自营的吗 是的 那为什么不是京东的物流? 好吧，那没事了 没有了，谢谢'),\n",
      " (74304,\n",
      "  0.5059619,\n",
      "  '[订单编号:[ORDERID_10460448]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 你好 发票是时候开给我 对的 好的'),\n",
      " (69495,\n",
      "  0.4909149,\n",
      "  '咨询订单号:[ORDERID_10035371] 订单金额:[金额x] 下单时间:[日期x] 亲 电视机预约安装打哪个电话? 对 好吧')]\n",
      "########################################################################################\n",
      "第4轮\n",
      "----------------------------------------------------------------------------------------\n",
      "亲 电视机我们这边收到了 你帮我查一下[数字x]个订单的发票什么时候可以开给我了 [ORDERID_10027980]\n",
      "[(20906,\n",
      "  0.5859378,\n",
      "  '在吗? [订单编号:[ORDERID_10286083]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 在吗? 这个发票什么时候开给我呢? '\n",
      "  '这个发票什么时候开给我呢? 通过了 麻烦了'),\n",
      " (66130,\n",
      "  0.55454373,\n",
      "  '我想看一下我的电视机什么时候发货什么时候到 我想看一下我的电视机什么时候发货什么时候 在吗? 我想看一下我的电视机什么时候发货什么时候 '\n",
      "  '[ORDERID_10455526] 谢谢'),\n",
      " (74304,\n",
      "  0.5113672,\n",
      "  '[订单编号:[ORDERID_10460448]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 你好 发票是时候开给我 对的 好的'),\n",
      " (3051, 0.5084908, '这电视机不是自营的吗? 这电视机不是你们自营的吗 是的 那为什么不是京东的物流? 好吧，那没事了 没有了，谢谢'),\n",
      " (69495,\n",
      "  0.49543315,\n",
      "  '咨询订单号:[ORDERID_10035371] 订单金额:[金额x] 下单时间:[日期x] 亲 电视机预约安装打哪个电话? 对 好吧')]\n",
      "########################################################################################\n",
      "第5轮\n",
      "----------------------------------------------------------------------------------------\n",
      "亲 电视机我们这边收到了 你帮我查一下[数字x]个订单的发票什么时候可以开给我了 [ORDERID_10027980] [ORDERID_10027867]\n",
      "[(20906,\n",
      "  0.58529556,\n",
      "  '在吗? [订单编号:[ORDERID_10286083]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 在吗? 这个发票什么时候开给我呢? '\n",
      "  '这个发票什么时候开给我呢? 通过了 麻烦了'),\n",
      " (66130,\n",
      "  0.55288315,\n",
      "  '我想看一下我的电视机什么时候发货什么时候到 我想看一下我的电视机什么时候发货什么时候 在吗? 我想看一下我的电视机什么时候发货什么时候 '\n",
      "  '[ORDERID_10455526] 谢谢'),\n",
      " (74304,\n",
      "  0.51408345,\n",
      "  '[订单编号:[ORDERID_10460448]，订单金额:[金额x]，下单时间:[日期x] [时间x]] 你好 发票是时候开给我 对的 好的'),\n",
      " (3051, 0.5045527, '这电视机不是自营的吗? 这电视机不是你们自营的吗 是的 那为什么不是京东的物流? 好吧，那没事了 没有了，谢谢'),\n",
      " (69495,\n",
      "  0.49735335,\n",
      "  '咨询订单号:[ORDERID_10035371] 订单金额:[金额x] 下单时间:[日期x] 亲 电视机预约安装打哪个电话? 对 好吧')]\n",
      "########################################################################################\n"
     ]
    }
   ],
   "source": [
    "for turn in range(1, 6):\n",
    "    print(\"第%s轮\" % str(turn))\n",
    "    print(\"-\" * 88)\n",
    "    print(\" \".join(questions[i].split(\" \")[:turn]))\n",
    "    res = q_retrieve.similarity(\" \".join(questions[i].split(\" \")[:turn]), top=5)\n",
    "    pprint.pprint([x for x in res if x[1]>0.2])\n",
    "    print(\"#\" * 88)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python3.6",
   "language": "python",
   "name": "python3.6"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
